package total;

import java.util.Scanner;

/**
 * Description:
 * 有一个 n×n 的矩阵，每个位置 (i,j)如果是.表示为白色，如果是#表示为黑色。
 * 初始时，每个位置可以是黑色或白色的，(i,j)位置的值会作为ai,j给你。
 * 现在有一种操作，选择两个整数 i,j∈[1,n],记 (i,1),(i,2),…,(i,n)的颜色为 C1,C2,…Cn,
 * 将 (1,j),(2,j),…,(n,j)的颜色赋为 C1,C2,…,Cn。
 * 你的任务是将整个矩阵变成全黑，如果能够办到，输出最少步数，否则输出 −1 。
 * Input:
 * 第一行一个整数n。接下来n行，每行n个字符表示整个矩阵。
 * Output:
 * 输出只有一行，一个整数表示答案。
 * Sample Input:
 * 2
 * #.
 * .#
 * Sample Output:
 * 3
 * @author chenxiaokang
 */

public class Ques1949_1 {
	public static void main(String[] args) {
		
		char[][] charArray = new char[1100][1100];
		Scanner scan = new Scanner(System.in);
		int[] vis = new int[1100];
		
		while(scan.hasNext()){
			
			int n = scan.nextInt();
			String inLine = "";
			int whitePoint = 0;
			
			for(int i = 0;i < n;i ++){
				inLine = scan.next();
				for(int j = 0;j < n;j ++){
					charArray[i][j] = inLine.charAt(j);
				}
			}
			
			int flag = -1;
			
			for(int i = 0;i < n;i ++){
				int t = 0;
				for(int j = 0;j < n;j ++){
					//判断是否有解
					if(charArray[i][j] == '#')flag = 0;
					//判断当前点对应的是什么点
					if(charArray[j][i] == '.')t = 1;
					if(charArray[j][i] == '#')vis[i] = 1;
				}
				whitePoint += t;
			}
			if(flag == -1){
				System.out.println(flag);
			}else{
				int sum = 0;
				for(int i = 0;i < n;i++){
					int t = 0;
					for(int j = 0;j < n;j ++){
						if(charArray[i][j] == '.')t++;
					}
					if(t == n || vis[i]==1) t++;
					if(sum > t){
						sum = t;
					}else{
						sum = sum;
					}
				}
				System.out.println(whitePoint + sum);
			}
		}
	}
	
	public static void printCharArray(int n,char[][] charArray){
		for(int i = 0;i < n;i ++){
			for(int j = 0;j < n;j ++){
				System.out.print(charArray[i][j]);
			}
			System.out.println();
		}
	}
}
